home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / thesource-7.lha / Source / DefFunc.lha / DefFunc / dfcscan.h < prev    next >
C/C++ Source or Header  |  1993-12-14  |  3KB  |  130 lines

  1. /****************************************************************
  2.  *
  3.  *    Copyright (c) 1993  Ke Jin
  4.  *
  5.  *    Permission to use, copy, modify, and distribute
  6.  *    this software and its documentation without fee
  7.  *    is granted, provided that the author's name and
  8.  *    this copyright notice are retained.
  9.  *
  10.  * -------------------------------------------------------------
  11.  *  
  12.  *   dfcscan.h --- the lexical scaner of defunc
  13.  *
  14.  *   private variable : yyexpr;
  15.  *                      yyexprlen;
  16.  *                      yytext;
  17.  *                      yypos;
  18.  *
  19.  *   private function : yylex();
  20.  *
  21.  ****************************************************************/
  22.  
  23. #ifndef _DFCSCAN_H
  24. #define _DFCSCAN_H
  25.  
  26. #include <stdio.h>
  27. #include <ctype.h>
  28. #include <string.h>
  29. #include "dfcsymtable.h"
  30.  
  31. #ifdef __cplusplus
  32.   extern "C" {    /* for c++ */
  33. #endif
  34.  
  35. static char* yyexpr;
  36. static int   yyexprlen;
  37. static char* yytext; 
  38. static int   yypos;
  39.  
  40. #if NeedFunctionPrototypes
  41.   static int yylex(void)
  42. #else
  43.   static int yylex()
  44. #endif
  45. {
  46.    char c;    
  47.    int  i;
  48.  
  49.    Symbol_record* ptr;
  50.  
  51.    /* --- [ \t] do nothing --------------------------------- */
  52.    for(;yypos<yyexprlen;yypos++)
  53.    {
  54.       c=yyexpr[yypos];
  55.       if(c==' '||c=='\t') continue;
  56.       break; 
  57.    }
  58.  
  59.    /* --- {number} return token CONST with value ----------- */ 
  60.    if(c=='.'||isdigit(c))
  61.    {
  62.        sscanf(yyexpr+yypos, "%lf", &(yylval.value));
  63.        for(;yypos<=yyexprlen;yypos++)
  64.        {
  65.        c=yyexpr[yypos];
  66.        if(c=='.'||isdigit(c)) continue;
  67.        break;
  68.        }
  69.        return CONST;
  70.    }
  71.  
  72.    /* --- {symbol} return token VAR or FNCT with fnctptr --- */
  73.    if(isalpha(c))
  74.    {
  75.        yytext = (char*)malloc(sizeof(char)*(yyexprlen-yypos+1));
  76.        if(yytext==0) 
  77.        {
  78.        perror("malloc for token text in module scaner");
  79.        exit(1);
  80.        }
  81.  
  82.        for(i=0;yypos<=yyexprlen;yypos++, i++)
  83.        {
  84.        c=yyexpr[yypos];
  85.        if(isalnum(c))
  86.        {
  87.            yytext[i]=c;
  88.            continue;
  89.            }
  90.        yytext[i]='\0';
  91.        break;
  92.        }
  93.  
  94.        ptr = (Symbol_record*)getsym(yytext);
  95.        if(ptr==0) /* symbol not in table */
  96.        {
  97.        strncpy(yylval.name, yytext, 32);
  98.        return SYM;
  99.        }
  100.  
  101.        switch (ptr->type)
  102.        {
  103.        case arg_symbol:
  104.         yylval.argidx = ptr->content.argidx;
  105.         return ARG;
  106.            
  107.        case fnct_symbol:
  108.             yylval.fnctptr = ptr->content.fnctptr; 
  109.             return FNCT;
  110.  
  111.            case const_symbol:
  112.             yylval.value = ptr->content.value; 
  113.             return CONST;
  114.        }
  115.    }
  116.  
  117.    /* ------ append a '\n' on end ----------------- */
  118.    if(yypos==yyexprlen) return '\n';
  119.  
  120.    yypos++;
  121.    /* ------ return other characters -------------- */
  122.    return c;
  123. };
  124.  
  125. #ifdef __cplusplus
  126.   }    /* end for c++ */
  127. #endif
  128.  
  129. #endif /* _DFCSCAN_H */
  130.